#ifndef __SCONSOLESTATS_H__
#define __SCONSOLESTATS_H__
#include <pthread.h>
#include <sys/signal.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include "StructList.h"
#include "DefaultUtils.h"
#include "ServeUtils.h"


#define LINELEN 128
#define INTERVAL_TIME 2
#define MAX_LENGTH_OF_CONSOLE 16

typedef enum ENUM_CONSOLE_FLAGS
{
    ECF_NONE = 0 ,//无命令
    ECF_CLOSE_SERVE,//关闭服务器服务,close
    ECF_START_SERVE,//开启服务器服务,start
    ECF_SHUT_DOWN,//关闭服务器程序,shutdown
    ECF_HELP,//帮助命令,?
    ECF_USER,//登录命令，user
    ECF_BYE,//注销命令，bye
}E_CONSOLE_FLAGS;

struct StructServe
{
        //服务器基本软件是否运行
    int IsWorking;
    //服务器软件(网络)是否开启
    int IsStart;
    char servename[16];
    int16_t port;
    int qlen;
};
/**全局通信结构，用于管理员管理服务器*/
struct SConsoleStats
{
    //锁控制器
    pthread_mutex_t pmtforstats;
    //用于保存服务器的基本信息,便于控制服务器开启关闭
    struct StructServe mServeStats;
    //命令
    char buf[LINELEN+1];
    //当前命令状态
    E_CONSOLE_FLAGS enumconsoleflags;


     int mastersocket;
    //函数指针
    void (*Constructor)(struct SConsoleStats* stats);

    void (*Destructor)(struct SConsoleStats* stats);

    int (*MutexInit)(struct SConsoleStats* stats);

    int (*MutexLock)(struct SConsoleStats* stats);

    int (*MutexUnlock)(struct SConsoleStats *  stats);

    int (*ConsoleMain)(struct SConsoleStats* stats);

    int (*TranslateMessage)(struct SConsoleStats* stats);

    int (*DispatchMessage)(struct SConsoleStats* stats);

    //执行命令的函数
    int  (*DoConsoleCloseServe)(struct SConsoleStats* stats);

    int (*DoConsoleStartServe)(struct SConsoleStats* stats);

    int (*DoConsoleShutdown)(struct SConsoleStats* stats);

    int (*DoConsoleHelp)(struct SConsoleStats* stats);

    int (*DoConsoleUser)(struct SConsoleStats* stats);

    int(*DoConsoleBye)(struct SConsoleStats* stats);
    //辅助函数
    int (*isWorking)(struct SConsoleStats* stats);

    int (*isStarting)(struct SConsoleStats* stats);
};

typedef struct SConsoleStats CConsoleStats;

/**全局，单例*/
static CConsoleStats* StaticConsoleStats = 0;

CConsoleStats*  CConsoleStatsGetInstance();

/**构造函数*/
void CConsoleStatsConstructor(CConsoleStats* stats);

void CConsoleStatsDestructor(CConsoleStats* stats);

int ConsoleStatsMutexInit(struct SConsoleStats* stats);

int ConsoleStatsLock(struct SConsoleStats* stats);

int ConsoleStatsUnlock(struct SConsoleStats *  stats);

//主控制管理函数
int ConsoleStatsMain(struct SConsoleStats *  stats);


//获取命令,解析命令
int ConsoleStatsTransport(struct SConsoleStats *  stats);
//执行命令
int ConsoleStatsDispatch(struct SConsoleStats *  stats);

//关闭服务
int  ConsoleStatsDoConsoleCloseServe(struct SConsoleStats* stats);

//开启服务
int ConsoleStatsDoConsoleStartServe(struct SConsoleStats* stats);

//关闭服务器
int ConsoleStatsDoConsoleShutdown(struct SConsoleStats* stats);

//帮助
int  ConsoleStatsDoConsoleHelp(struct SConsoleStats* stats);

//登录
int ConsoleStatsDoConsoleUser(struct SConsoleStats* stats);

//注销
int ConsoleStatsDoConsoleBye(struct SConsoleStats* stats);


//辅助函数
int ConsoleStatsIsWorking(struct SConsoleStats *  stats);

int ConsoleStatsIsStarting(struct SConsoleStats *  stats);
#endif // __SCONSOLESTATS_H__
